home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 2 / LSD and 17bit Compendium Deluxe - Volume II.iso / a / prog / asmsrc / tango2.lha / SOURCES / fast2pixel.s < prev    next >
Text File  |  1989-09-14  |  12KB  |  569 lines

  1. ;    ** RAY SEE IF KODAK CAN MAKE THIS ANY BETTER **
  2. ; ** 2 PIXEL ACCURACY SINE WAVE BY TANGO OF CRYPTIC **
  3. ;     ** ONLY SPREAD SOURCE TO CRYPTIC MEMBERS **
  4.  
  5.     opt c-
  6.     section blitter,code_c            Chip Ram please !!
  7.     include    df1:definitions            Give me some hardware reggies
  8.     include    df1:macros                Give me some macros
  9.     
  10.         
  11. ;LOCAL CONSTANTS
  12.  
  13. icra        equ $bfed01                
  14. allocmem     =-30-168                
  15. freemem     =-30-180                
  16.  
  17. TAKEOVER:
  18.  
  19. ; KILL SYSTEM COPPER, KEYBOARD ETC.....
  20.  
  21.     LEA custom,a5        
  22.     LEA GFXLIB(PC),a1             Point to 'graphics.library'
  23.     MOVEQ #0,D0                     Doesn't matter which version
  24.      MOVE.L 4.w,a6                 EXECBASE
  25.     jsr    -132(a6)                 task switching off (forbid)
  26.      JSR -$228(a6)                  Openlibrary
  27.      MOVE.L D0,GFXBASE             Store library address
  28.  
  29.         
  30. ;Now put the graphic addresses in the CopperList         
  31.  
  32.  
  33.      move.l    #sprite,d1            
  34.      move.w    d1,sp0lo+2
  35.      swap    d1
  36.      move.w    d1,sp0hi+2
  37.  
  38.  
  39.      move.l GFXBASE,d0            Move gfxbase offset to d0
  40.      MOVE.L D0,A6                
  41.      MOVE.W #$80,dmacon(a5)        Turn off copper whilst changing it
  42.      MOVE.L $32(A6),WBCOPPER         Store old (WBench) copper address
  43.      MOVE.L #OURCOPPER,$32(A6)    Point to new copper list (our own)
  44.      MOVE.W #$8080,dmacon(a5)    re-enable copper
  45.  
  46.      MOVE.W #$8010,intena(a5)        
  47.      MOVE.L $6c,old                Save work bench interrupt
  48.      MOVE.L #LEV3,$6c            This sets up a level 3 interrupt
  49.     move.w    intenar(a5),systemints
  50.     move.b    #%01111111,icra        Kill keyboard
  51.         
  52. WAIT:     
  53.     BTST #6,$BFE001                This waits for the left
  54.      BNE.S    WAIT                mouse button to be pressed
  55.     move.l    4.w,a6                EXECBASE
  56.      MOVE.L old,$6c                Restore system interrupts
  57.     MOVE.L GFXBASE,A6
  58.      MOVE.W #$80,dmacon(a5)        Disable DMA
  59.      MOVE.L WBCOPPER,$32(A6)        Restore old copperlist
  60.      MOVE.W #$8080,dmacon(a5)    Enable DMA
  61.      move.w    systemints,d0        Systems interrupt
  62.      or.w    #$c000,d0
  63.      move.w    d0,intena(a5)        Enable OS interrupts
  64.      move.b    #%10011011,icra        Enable keyboard
  65.     clr.w    $dff0a8                Clear music
  66.     clr.w    $dff0b8
  67.     clr.w    $dff0c8
  68.     clr.w    $dff0d8
  69.     move.w    #$f,$dff096
  70.     CLR.L    D0
  71.     rts
  72.  
  73.  
  74. ERROR:    
  75.     move.l 4.w,a6                Get EXECBASE
  76.     jsr    -138(a6)                Permit ( multi-tasking on )
  77.     moveq    #0,d0                Clear d0
  78.      RTS                            Return to AmigaDOS
  79.  
  80.  
  81. ;This is the NEW level 3 interrupt
  82.  
  83. LEV3:
  84.      MOVEM.L d0-d7/a0-a6,-(sp)    Save all registers to the stack
  85.     lea    custom,a5
  86.     AND #$10,intreqr(a5)           Check if interrupt is from Copper 
  87.     BNE out
  88.     move.w    #$8010,$9c                                
  89.     
  90.  
  91. ; ** ALL ROUTINES CALLED (HOPEFULLY) EVERY VBI **
  92.  
  93.     MOVE.W #$FFF,$DFF180
  94.     bsr    try_sin
  95.     bsr    testscroll
  96.  
  97.      move.l    sin_screen,d1        Bitplane memory address
  98.     move.w    d1,bp1lo+2            Used for double buffering
  99.      swap    d1
  100.      move.w    d1,bp1hi+2
  101.  
  102.     bsr        move_stars
  103.     MOVE.W #$000,$DFF180
  104.     
  105.     
  106. out:     
  107.     MOVEM.L (sp)+,d0-d7/a0-a6    Restore the registers
  108.     DC.W $4ef9                    hex value for  JMP instruction
  109. old:     
  110.     DC.L 0                        will jump to normal interrupt
  111.  
  112.  
  113. ; ** Move the sprites **
  114.  
  115. move_stars:
  116.  
  117.     sub.b    #$1,x+1
  118.     sub.b    #$2,x+9
  119.     sub.b    #$1,x+17
  120.     sub.b    #$3,x+25
  121.     sub.b    #$2,x+33
  122.     sub.b    #$4,x+41
  123.     sub.b    #$2,x+49
  124.     sub.b    #$1,x+57
  125.     sub.b    #$3,x+65
  126.     sub.b    #$1,x+73
  127.     sub.b    #$2,x+81
  128.     sub.b    #$4,x+89
  129.     sub.b    #$3,x+97
  130.     sub.b    #$2,x+105
  131.     sub.b    #$1,x+113
  132.     sub.b    #$4,x+121
  133.     sub.b    #$3,x+129
  134.     sub.b    #$3,x+137
  135.     sub.b    #$2,x+145
  136.     sub.b    #$4,x+153
  137.     sub.b    #$1,x+161
  138.     sub.b    #$3,x+169
  139.     sub.b    #$1,x+177
  140.     sub.b    #$2,x+185
  141.     sub.b    #$4,x+193
  142.     sub.b    #$1,x+201
  143.     sub.b    #$3,x+209
  144.     sub.b    #$1,x+217
  145.     sub.b    #$2,x+225
  146.     sub.b    #$2,x+233
  147.     rts
  148.  
  149.  
  150. ; ** Double Buffer The Screen **
  151.  
  152. Buff:
  153.     Eor.l    #10240,Tango                ; Next screen is 10240 bytes along
  154.     Move.l    Tango,D1
  155.     Move.l    #SinePlane,d2
  156.     Add.l    D1,d2
  157.     Move.l    D2,Sin_Screen
  158.     Rts
  159.  
  160.  
  161. ; ** THE SCROLL ROUTINE **
  162.  
  163. testscroll:
  164.     tst.l    stopper
  165.     beq.s    scroll
  166.     sub.l    #1,stopper
  167.     rts
  168. scroll:
  169.     cmp.l    #15*4,val                Blitshifted all <<<
  170.     blo.s    coarse_scroll_it        No then get doing it !!
  171.     bsr        blit_char                Blit letter to screen
  172.     clr.l    val                        Reset index
  173. coarse_scroll_it:
  174.     bsr        coarse                    Scroll all line
  175.     rts                            
  176.     
  177.     
  178. ; ** BLIT LETTER ON THE SCREEN **
  179.  
  180. blit_char
  181.     jsr        text
  182.     lea        custom,a5                Get custom chip address
  183.     move.l    screenx,a0                 Can~t see this picture !!
  184.     move.l    #font,a1                 Put font in blitter source
  185.     add.l    d1,a1
  186. blit_test:
  187.     btst    #14,$dff002                 Blitter busy !!!
  188.     bne    blit_test                     Lets wait till she finishes !
  189.     move.w    #$ffff,bltafwm(a5)        
  190.     move.w    #$ffff,bltalwm(a5)        
  191.     move.l    a0,bltdpth(a5)             Blitter dest D (BOTTOM OF SCREEN)
  192.     move.l    a1,bltapth(a5)             Blitter source A (SCROLLING FONT)
  193.     move.w    #38,bltamod(a5)             Modulo (20-1)*2
  194.     move.w    #38,bltdmod(a5)             Modulo (20-1)*2
  195.     move.w    #$9f0,bltcon0(a5)         Minterms D=A
  196.     clr.w    bltcon1(a5)                 Set Ascending mode
  197.      move.w    #16*64+1,bltsize(a5)     Blit size (SIZE OF FONT)
  198.     rts                                  Return
  199.  
  200.  
  201. ; ** BLITSHIFT THE ENTIRE SCROLL LINE **
  202.  
  203. coarse:
  204.     lea        custom,a5                 
  205.     move.l    screenx,a0                ; Can~t see this picture !!
  206.     move.l    a0,a1
  207.     add.l    #2,a1
  208. blit_wait:
  209.     btst    #14,$dff002            
  210.     bne        blit_wait
  211.     incl    #4,val                    ; (1 for slower)
  212.     move    #15,d7                    ; Amount of pixels to shift(15 for slow)
  213.     ror        #4,d7                    ; Set to correct bits (12-15)
  214.     or        #%100111110000,d7        
  215.     move.l    #-1,bltafwm(a5)
  216.     move.l    a1,bltapth(a5)
  217.     move.l    a0,bltdpth(a5)
  218.     move.w    #0,bltamod(a5)
  219.     move.w    #0,bltdmod(a5)
  220.     move.w    d7,bltcon0(a5)    
  221.     move.w    #80*64+20,bltsize(a5)
  222.     rts    
  223.  
  224.  
  225. ; ** BLITTER CLEAR WHERE THE SINE SCROLL HAS JUST BEEN **
  226.  
  227. CLEAR:
  228.     Move.l    Sin_Screen,a0
  229. wate
  230.     btst    #14,$dff002
  231.     bne.s    wate
  232.     Move.l    a0,Bltdpth(a5)
  233.     Move    #0,Bltdmod(a5)
  234.     Move.l    #$1f00000,Bltcon0(a5)
  235.     Move    #133*64+20,Bltsize(a5)
  236.     Rts
  237.  
  238.  
  239. ; ** DO THE SINEWAVE **
  240. ; BLITTER HAS TO COPY EVERY 2 PIXELS ACROSS, THATS ALOT OF WORK !!!
  241.  
  242. try_sin:
  243.     Bsr        buff
  244.     bsr        clear
  245.     Move.l    Table1,A3
  246.     Move.w    (A3),d1
  247.     Cmp.w    #$ffff,d1
  248.     Bne        ItsOkYa
  249.     Move.l    #SinTab,A3
  250. ItsOkYa
  251.     Add.l    hi_amplitude,A3
  252.     Move.l    a3,Table1
  253.     Move.l    A3,Table
  254.     lea        custom,a5                 
  255.     MOVE.W    #$DFC,D2                ; D=A+B
  256.     LEA        BLTAFWM(A5),A2            ; FWM           IN A2
  257.     LEA        BLTAPTH(A5),A6
  258.     MOVE.W    #16*64+1,D7                ;                IN D3
  259.     move.l    screenx,a0                 ; Source A
  260.     move.l    #18,d4                    ; Number of chars along screen
  261.     clr.l    d5
  262.     clr.l    d6
  263. ban:
  264.     MOVE.W    #%1100000000000000,d3    ; PUT TO 1 FOR ONE PIXEL 
  265. blit_test0:      
  266.     BSR        BLIT_WAITMAN
  267.     move.w    D2,bltcon0(a5)         
  268.     clr.w    bltcon1(a5)                 
  269.     move.w    #38,bltamod(a5)             
  270.     move.w    #38,bltdmod(a5)             
  271.     move.w    #38,bltbmod(a5)             
  272.      REPT    8
  273.     move.l    sin_screen,a1
  274.     bsr        get_sinvalue
  275.     move.w    d3,(A2)                    ; FWM MASK
  276.     move.l    a1,bltdpth(a5)             
  277.     move.l    a1,bltbpth(a5)             
  278.     move.l    a0,(A6)
  279.     MOVE.W    D7,bltsize(a5)            ; BLITSIZE
  280.     lsr        #2,d3
  281.     ENDR
  282.     add.l    #2,a0                    ; Get next letter along
  283.     add.l    #2,d6
  284.     dbf        d4,ban
  285.     rts                                  
  286.  
  287.  
  288. BLIT_WAITMAN:
  289.     BTST    #14,$DFF002
  290.     BNE.S    BLIT_WAITMAN
  291.     RTS
  292.     
  293.     
  294. get_sinvalue:
  295.     Clr.l    D5
  296.     Move.l    Table,A3
  297.     Move.w    (A3),d5
  298.     cmp.w    #$ffff,d5
  299.     bne        cryptic90
  300.     Move.l    #SinTab,A3
  301.     Move.w    (a3),d5
  302. cryptic90
  303.     Add.l    lo_amplitude,A3
  304.     Move.l    A3,Table
  305.     add.l    d5,a1
  306.     Add.l    D6,A1
  307.     rts
  308. Table1:    Dc.l    SinTab    
  309. table:    dc.l    sintab
  310.  
  311.  Even
  312. ; ** RAY SEE IF YOU CAN GET A BETTER SINUS TABLE FOR FULL SCREEN !!! **
  313. sintab:
  314.     dc.w $3C*40,$3F*40,$42*40,$46*40,$49*40,$4C*40,$50*40,$53*40,$56*40,$59*40
  315.     dc.w $5C*40,$5F*40,$61*40,$64*40,$67*40,$69*40,$6B*40,$6D*40,$6F*40,$71*40
  316.     dc.w $72*40,$73*40,$75*40,$76*40,$76*40,$77*40,$77*40,$77*40,$77*40,$77*40
  317.     dc.w $77*40,$76*40,$76*40,$75*40,$73*40,$72*40,$71*40,$6F*40,$6D*40,$6B*40
  318.     dc.w $69*40,$67*40,$64*40,$61*40,$5F*40,$5C*40,$59*40,$56*40,$53*40,$50*40
  319.     dc.w $4C*40,$49*40,$46*40,$42*40,$3F*40,$3C*40,$38*40,$35*40,$31*40,$2E*40
  320.     dc.w $2B*40,$27*40,$24*40,$21*40,$1E*40,$1B*40,$18*40,$16*40,$13*40,$10*40
  321.     dc.w $E*40,$C*40,$A*40,$8*40,$6*40,$5*40,$4*40,$2*40,$1*40,$1*40
  322.     dc.w $0*40,$0*40,$0*40,$0*40,$0*40,$0*40,$1*40,$1*40,$2*40,$4*40
  323.     dc.w $5*40,$6*40,$8*40,$A*40,$C*40,$E*40,$10*40,$13*40,$16*40,$18*40
  324.     dc.w $1B*40,$1E*40,$21*40,$24*40,$27*40,$2B*40,$2E*40,$31*40,$35*40
  325.     dc.w $38*40
  326.     Dcb.w    10,$ffff
  327.      EVEN
  328.      
  329.  
  330. ; ** CHARACTER DECODER ROUTINE **
  331.  
  332. text:
  333.     move.l    acurent,a2                Get message
  334.     clr.l    d1                        
  335.     move.b    (a2)+,d1                Update it
  336.     move.b    d1,letter                Store in offset
  337.     cmp.b    #255,d1                    Check for end of message
  338.     beq.w    rst_text                If equal, then reset
  339.     cmp.b    #254,d1
  340.     beq        stop
  341.     sub.l    #32,d1                    Subract 32 (ie space)
  342.     asl        d1                        Times by 2 
  343.     move.l    a2,acurent                Update acurent
  344.     CMP.B    #"4",letter                Is letter "K" or larger
  345.     BPL.s    add_more                If larger then add on
  346.     rts                                Return
  347. add_more:
  348.     CMP.B    #"H",letter                Is letter "U" or larger
  349.     BPL.S    add_more2                If larger then add on
  350.     add.l    #40*15,d1                Get next line down (KLMNOPQRST)
  351.     rts
  352. add_more2:                    
  353.     add.l    #40*30,d1                Get next line down (UVWXYZ0123)
  354.     rts
  355. rst_text:
  356.     move.l    #0,d1
  357.     move.l    #message,d2                Get begining of text
  358.     move.l    d2,acurent                Reset to begining
  359.     rts                                Return
  360. stop:
  361.     move.l    #0,d1
  362.     add.l    #1,acurent
  363.     move.l    #150,stopper
  364.     rts
  365.  
  366. message:
  367.  
  368. ; 254=STOP,255=END.
  369.  
  370.     DC.B    " HI RAY    THIS IS A 2 PIXEL SINE SCROLL (HONESTLY!!)"
  371.     DC.B    "  CHECK OUT THE SINETABLE IN THE SOURCE AND SEE IF YOU CAN GET A BETTER AND BIGGER ONE TO GET FULL SCREEN"
  372.     DC.B    "  ALSO SEE IF KODAK CAN MAKE THIS RUN ANY FASTER COS ITS ABIT SLOOOOW"
  373.     DC.B    "  WRITE SOON....      PS. I'LL SEE YA ALL IN BLACKPOOL ON SATURDAY !!!!!"
  374.     DC.B    "   WRAP           ",255
  375.     EVEN
  376.             
  377.  
  378. ; ** THE COPPERLIST **
  379.  
  380. OURCOPPER:
  381. sp0lo:    dc.w    spr0ptl,$0000
  382. sp0hi:    dc.w    spr0pth,$0000
  383.         dc.w    bpl1mod,0,bpl2mod,0
  384.         dc.w    diwstrt,$2c81+16,diwstop,$2cc1
  385.         dc.w    bplcon0,$1200,bplcon1,$0000
  386.         dc.w    ddfstrt,$38,ddfstop,$d0
  387. *        dc.w    color00,$000,color01,$094
  388.         dc.w    color16,$aaa,color17,$aaa,color18,$aaa
  389.         dc.w    color19,$aaa,color20,$aaa
  390. bp1lo:    dc.w    bpl1ptl,$0000
  391. bp1hi:    dc.w    bpl1pth,$0000
  392.         wait    $2c09,$fffe
  393.         dc.w    color01,$f00
  394.         wait    $2e09,$fffe
  395.         dc.w    color01,$f11
  396.         wait    $3009,$fffe
  397.         dc.w    color01,$f00
  398.         wait    $3209,$fffe
  399.         dc.w    color01,$f11
  400.         wait    $3409,$fffe
  401.         dc.w    color01,$f22
  402.         wait    $3609,$fffe
  403.         dc.w    color01,$f33
  404.         wait    $389,$fffe
  405.         dc.w    color01,$f44
  406.         wait    $3a09,$fffe
  407.         dc.w    color01,$f55
  408.         wait    $3c09,$fffe
  409.         dc.w    color01,$f66
  410.         wait    $3e09,$fffe
  411.         dc.w    color01,$f77
  412.         wait    $4009,$fffe
  413.         dc.w    color01,$f88
  414.         wait    $4209,$fffe
  415.         dc.w    color01,$f99
  416.         wait    $4409,$fffe
  417.         dc.w    color01,$faa
  418.         wait    $4609,$fffe
  419.         dc.w    color01,$fbb
  420.         wait    $4809,$fffe
  421.         dc.w    color01,$fcc
  422.         wait    $4a09,$fffe
  423.         dc.w    color01,$fdd
  424.         wait    $4c09,$fffe
  425.         dc.w    color01,$fee
  426.         wait    $4e09,$fffe
  427.         dc.w    color01,$fff
  428.         wait    $5109,$fffe
  429.         dc.w    color01,$eef
  430.         wait    $5309,$fffe
  431.         dc.w    color01,$ddf
  432.         wait    $5509,$fffe
  433.         dc.w    color01,$ccf
  434.         wait    $5709,$fffe
  435.         dc.w    color01,$bbf
  436.         wait    $5909,$fffe
  437.         dc.w    color01,$aaf
  438.         wait    $5b09,$fffe
  439.         dc.w    color01,$99f
  440.         wait    $5d09,$fffe
  441.         dc.w    color01,$88f
  442.         wait    $5f09,$fffe
  443.         dc.w    color01,$77f
  444.         wait    $6109,$fffe
  445.         dc.w    color01,$66f
  446.         wait    $6309,$fffe
  447.         dc.w    color01,$55f
  448.         wait    $6509,$fffe
  449.         dc.w    color01,$44f
  450.         wait    $6709,$fffe
  451.         dc.w    color01,$33f
  452.         wait    $6909,$fffe
  453.         dc.w    color01,$22f
  454.         wait    $6a09,$fffe
  455.         dc.w    color01,$11f
  456.         wait    $6c09,$fffe
  457.         dc.w    color01,$00f
  458.         wait    $6e09,$fffe
  459.         dc.w    color01,$11f
  460.         wait    $7109,$fffe
  461.         dc.w    color01,$22f
  462.         wait    $7309,$fffe
  463.         dc.w    color01,$33f
  464.         wait    $7509,$fffe
  465.         dc.w    color01,$44f
  466.         wait    $7709,$fffe
  467.         dc.w    color01,$55f
  468.         wait    $7909,$fffe
  469.         dc.w    color01,$66f
  470.         wait    $7a09,$fffe
  471.         dc.w    color01,$77f
  472.         wait    $7c09,$fffe
  473.         dc.w    color01,$88f
  474.         wait    $7e09,$fffe
  475.         dc.w    color01,$99f
  476.         wait    $8009,$fffe
  477.         dc.w    color01,$aaf
  478.         wait    $8209,$fffe
  479.         dc.w    color01,$bbf
  480.         wait    $8409,$fffe
  481.         dc.w    color01,$ccf
  482.         wait    $8609,$fffe
  483.         dc.w    color01,$ddf
  484.         wait    $8809,$fffe
  485.         dc.w    color01,$eef
  486.         wait    $8a09,$fffe
  487.         dc.w    color01,$fff
  488.         wait    $8c09,$fffe
  489.         dc.w    color01,$fee
  490.         wait    $8e09,$fffe
  491.         dc.w    color01,$fdd
  492.         wait    $9109,$fffe
  493.         dc.w    color01,$fcc
  494.         wait    $9309,$fffe
  495.         dc.w    color01,$fbb
  496.         wait    $9509,$fffe
  497.         dc.w    color01,$faa
  498.         wait    $9709,$fffe
  499.         wait    $9909,$fffe
  500.         dc.w    color01,$f99
  501.         wait    $9b09,$fffe
  502.         dc.w    color01,$f88
  503.         wait    $9d09,$fffe
  504.         dc.w    color01,$f77
  505.         wait    $9f09,$fffe
  506.         dc.w    color01,$f66
  507.         end_copper
  508.         
  509.  
  510. ;LOCAL CONSTANTS
  511.  
  512. WBCOPPER:        DC.L    0
  513. GFXLIB:            DC.B     "graphics.library",0
  514. GFXBASE:        DC.L    0
  515. systemints:        dc.l    0
  516. scroll_offset:    dc.l    0
  517. screenx:        dc.l    picture
  518. letter:            dc.b    0
  519. acurent:        dc.l    message
  520. val:            dc.l    0
  521. lo_amplitude:    dc.l    2                        ; PISS AROUND WITH THESE
  522. hi_amplitude:    dc.l    4                        ; PISS AROUND WITH THESE
  523. Tango            Dc.l    0
  524. sin_screen:        Dc.l    SinePlane
  525. stopper:        dc.l    0
  526.  
  527.  
  528. ;BINARY FILES TO BE INCLUDED
  529.     EVEN
  530. picture    
  531.     dcb.b    10240,0
  532. SinePlane
  533.     dcb.b    10240,0
  534.     dcb.b    10240,0
  535. font
  536.     incbin    df1:neatfont.bin
  537. sprite:
  538.     include    df1:sprite.list
  539.  
  540.  
  541.  
  542.  
  543.  
  544.  
  545.     
  546.     
  547.  
  548.  
  549.  
  550.  
  551.  
  552.  
  553.  
  554.     
  555.     
  556.  
  557.  
  558.  
  559.  
  560.  
  561.  
  562.  
  563.  
  564.  
  565.  
  566.  
  567.     
  568.     
  569.